package com.zshy.base.monitor.domain.contract.command;

import com.zshy.base.monitor.domain.contract.enums.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;

import java.util.List;

/**
 * 模版卡片类型
 *
 * @author zhouhengzhe
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class SendMessageByTemplateCardCommand {

    /**
     * 模版卡片的模版类型：
     * - 文本通知模版卡片的类型为text_notice
     * - 图文展示模版卡片的类型为news_notice
     *
     * @see com.zshy.base.monitor.domain.contract.enums.CardTypeEnum
     */
    @NotBlank(message = "模版卡片的模版类型不能为空")
    private CardTypeEnum cardType;
    /**
     * 卡片来源样式信息
     */
    private Source source;
    /**
     * 模版卡片的主要内容，包括一级标题和标题辅助信息
     */
    @NotNull(message = "模版卡片的主要内容不能为空")
    private MainTitle mainTitle;
    /**
     * 关键数据样式
     */
    private EmphasisContent emphasisContent;
    /**
     * 引用文献样式，建议不与关键数据共用
     */
    private QuoteArea quoteArea;
    /**
     * 二级普通文本，建议不超过112个字。模版卡片主要内容的一级标题main_title.title和二级普通文本sub_title_text必须有一项填写
     */
    @Length(max = 112, message = "二级普通文本不能超过112个字")
    private String subTitleText;
    /**
     * 二级标题+文本列表，该字段可为空数组，但有数据的话需确认对应字段是否必填，列表长度不超过6
     */
    @Size(max = 6, message = "二级标题+文本列表长度不能超过6")
    private List<HorizontalContentList> horizontalContentList;
    /**
     * 跳转指引样式的列表，该字段可为空数组，但有数据的话需确认对应字段是否必填，列表长度不超过3
     */
    @Size(max = 3, message = "跳转指引样式的列表长度不能超过3")
    private List<JumpList> jumpList;
    /**
     * 整体卡片的点击跳转事件，text_notice模版卡片中该字段为必填项
     */
    @NotNull(message = "整体卡片的点击跳转事件不能为空")
    private CardAction cardAction;

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class Source {

        /**
         * 来源图片的url
         */
        private String iconUrl;
        /**
         * 来源图片的描述，建议不超过13个字
         */
        private String desc;
        /**
         * 来源文字的颜色，目前支持：0(默认) 灰色，1 黑色，2 红色，3 绿色
         *
         * @see com.zshy.base.monitor.domain.contract.enums.DescColorEnum
         */
        private DescColorEnum descColor;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class MainTitle {

        /**
         * 一级标题，建议不超过26个字。模版卡片主要内容的一级标题main_title.title和二级普通文本sub_title_text必须有一项填写
         */
        @Length(max = 26, message = "一级标题不能超过26个字")
        private String title;
        /**
         * 标题辅助信息，建议不超过30个字
         */
        @Length(max = 30, message = "标题辅助信息不能超过30个字")
        private String desc;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class EmphasisContent {
        /**
         * 关键数据样式的数据内容，建议不超过10个字
         */
        @Length(max = 10, message = "关键数据样式的数据内容不能超过10个字")
        private String title;
        /**
         * 关键数据样式的数据描述内容，建议不超过15个字
         */
        @Length(max = 15, message = "关键数据样式的数据")
        private String desc;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class QuoteArea {
        /**
         * 引用文献样式区域点击事件，0或不填代表没有点击事件，1 代表跳转url，2 代表跳转小程序
         *
         * @see com.zshy.base.monitor.domain.contract.enums.QuoteAreaTypeEnum
         */
        private QuoteAreaTypeEnum type;
        /**
         * 点击跳转的url，quote_area.type是1时必填
         */
        private String url;
        /**
         * 点击跳转的小程序的appid，quote_area.type是2时必填
         */
        private String appId;
        /**
         * 点击跳转的小程序的pagepath，quote_area.type是2时选填
         */
        private String pagePath;
        /**
         * 引用文献样式的标题
         */
        private String title;
        /**
         * 引用文献样式的引用文案
         */
        private String quoteText;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class HorizontalContentList {

        /**
         * 模版卡片的二级标题信息内容支持的类型，1是url，2是文件附件，3 代表点击跳转成员详情
         *
         * @see com.zshy.base.monitor.domain.contract.enums.HorizontalContentListTypeEnum
         */
        private HorizontalContentListTypeEnum type;
        /**
         * 二级标题，建议不超过5个字
         */
        @Length(max = 5, message = "二级标题不能超过5个字")
        private String keyName;
        /**
         * 二级文本，如果horizontal_content_list.type是2，该字段代表文件名称（要包含文件类型），建议不超过26个字
         */
        @Length(max = 26, message = "二级文本不能超过26个字")
        private String value;
        /**
         * 链接跳转的url，horizontal_content_list.type是1时必填
         */
        private String url;
        /**
         * 附件的media_id，horizontal_content_list.type是2时必填
         */
        private String mediaId;

        /**
         * 成员详情的userid，horizontal_content_list.type是3时必填
         */
        private String userId;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class JumpList {

        /**
         * 跳转链接类型，0或不填代表不是链接，1 代表跳转url，2 代表跳转小程序
         *
         * @see com.zshy.base.monitor.domain.contract.enums.JumpListTypeEnum
         */
        private JumpListTypeEnum type;
        /**
         * 跳转链接样式的文案内容，建议不超过13个字
         */
        @Length(max = 13, message = "跳转链接样式的文案内容不能超过13个字")
        private String title;
        /**
         * 跳转链接的url，jump_list.type是1时必填
         */
        private String url;
        /**
         * 跳转链接的小程序的appid，jump_list.type是2时必填
         */
        private String appId;
        /**
         * 跳转链接的小程序的pagepath，jump_list.type是2时选填
         */
        private String pagePath;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public static class CardAction {
        /**
         * 卡片跳转类型，1 代表跳转url，2 代表打开小程序。text_notice模版卡片中该字段取值范围为[1,2]
         * @see com.zshy.base.monitor.domain.contract.enums.CardActionTypeEnum
         */
        @NotNull(message = "卡片跳转类型不能为空")
        private CardActionTypeEnum type;
        /**
         * 跳转事件的url，card_action.type是1时必填
         */
        private String url;
        /**
         * 跳转事件的小程序的appid，card_action.type是2时必填
         */
        private String appId;
        /**
         * 跳转事件的小程序的pagepath，card_action.type是2时选填
         */
        private String pagePath;
    }
}
